EC2Launch v2を使ってOpenSSH Server(sshd)のセットアップを行う方法

EC2Launch v2を使ってOpenSSH Server(sshd)のセットアップを行う方法

Clock Icon2024.11.09

しばたです。

先日Windows Server 2025がリリースされましたが、Windows Server 2025ではOpenSSH Server(sshd)の機能がインストール済みの状態[1]になっています。
Windows Server組み込みのsshd自体はWindows Server 2019からの新機能ですが、利用の敷居が下がったことでこれから多少は利用が増えるかもしれません。

Windows Server EC2の初期設定を行うEC2Launch v2にもsshdの初期設定を補助する機能があるので本記事ではこの機能について解説しようと思います。

おことわり

EC2Launch v2のenableOpenSshタスク

2020年にリリースされたEC2Launch v2はWindows Server EC2の初期設定を行うツールの最新版であり、Windows Server 2022のAMIから同梱される様になっています。

https://dev.classmethod.jp/articles/ec2launch-v2-released/

EC2Launch v2ではWindows Serve EC2の(初回)起動時の様々な初期処理を行っているのですが、この中にsshdのインストールと初期設定を行うenableOpenSshタスクがあります。

https://dev.classmethod.jp/articles/ec2launch-v2-all-features-202007/

このタスクでは

  • sshdの機能が追加されていない場合は機能の追加を行う
  • インスタンスメタデータからEC2キーペアの公開鍵を取得しadministrators_authorized_keysファイルに設定する
    • 加えてファイルに適切なアクセス権を設定
  • Windows FirewallにTCP 22番ポートを解放するルール(ルール名sshd)を追加

といった処理を自動で行います。
このタスクは「初回起動時」のみ利用可能なため、あらかじめEC2Launch v2の設定ファイルにタスクを仕込むかUserDataに以下の記述を追加することで実行できます。

UserDataに追記する内容
version: 1.1
tasks:
  - task: enableOpenSsh

これだけで諸々の作業を自動化してくれるので非常に便利です。

改良版 UserData

ただ、このenableOpenSshタスクは非常に便利なものの、Windows Serverのsshd自体が

  • 初期設定ではパスワード認証が有効
  • 初期設定では接続先シェルがコマンドプロンプト

であるため、せっかくEC2キーペアを使って鍵認証ができる様になっても片手落ちです。

この点に対してUserDataに次の様にexecuteScriptタスクを追加してやることと改善できます。

UserDataに追記する内容 (改善版)
version: 1.1
tasks:
  - task: enableOpenSsh
  - task: executeScript
    inputs:
      - frequency: once
        type: powershell
        runAs: admin
        content: |
          # Update sshd_config 
          $sshdConfigPath = Join-Path $env:ProgramData 'ssh\sshd_config'
          Get-Content $sshdConfigPath -Encoding Ascii -Raw | 
              ForEach-Object {
                  $c = $_ -replace '#PubkeyAuthentication', 'PubkeyAuthentication'
                  $c = $c -replace '#PasswordAuthentication yes', 'PasswordAuthentication no'
                  $c | Out-File -FilePath $sshdConfigPath -Encoding ascii
              }
          # Restart service
          Restart-Service sshd
          # Change default shell
          New-ItemProperty -Path 'HKLM:\SOFTWARE\OpenSSH' -Name DefaultShell -Value 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' -PropertyType String -Force

enableOpenSshタスクの次工程にPowerShellコマンドを実行するexecuteScriptタスクを追記し、

  • パスワード認証の無効化と鍵認証の有効化を明示した設定に更新
    • その後 sshd サービスを再起動
  • 接続先シェルをWindows PowerShellに変更

を行う様にしています。
executeScriptタスクでは実行の周期を選択できるので必ずfrequency: onceにします。

これでLinux EC2と同様にEC2キーペアの秘密鍵をつかった鍵認証のみが有効となります。

補足 : 手作業でsshdの設定を行う

前述の通りenableOpenSshタスクは初回起動時のみ実行可能です。

一度起動した後のEC2インスタンスに対してタスクを実行するにはEC2Launchの実行状態をリセットする必要があり、この方法は他のタスクも再実行され副作用が大きいのでお勧めできません。

一度起動した後の既存EC2に対しては手作業でsshdの機能を追加してやるのが現実的です。

Windows Server 2019 ~ Windows Server 2022の場合

Windows Server 2019 ~ Windows Server 2022に対しては以前書いた記事の内容がそのまま使えます。

https://dev.classmethod.jp/articles/configure-windows-server-2019-sshd/

こちらの記事の内容に従って作業してください。

Windows Server 2025の場合

先日リリースされたWindows Server 2025に対しても前掲の記事の内容が使えるのですが、Windows Server 2025独自の事情として

  • sshdの機能が初期インストール済み
  • Windows Firewallルール(OpenSSH SSH Server (sshd))のプロファイルがPrivateのみ
    • 以前のバージョンだとAllプロファイルで有効だった
  • AMIの初期設定でIMDSv2必須

という初期状態のため少し手順をカスタマイズしてやる必要があります。

1. 機能の有効化

Add-WindowsCapabilityコマンドの実行は不要でsshdサービスの起動設定だけ実施します。

# 初期状態で機能が追加済みなので実行不要
# Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

# サービスの起動設定だけ行う
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'

2. sshd_configの設定変更

従来通りの手順です。

3. 公開鍵設定

基本的にIMDSv2必須になっているのでインスタンスメタデータの取得方法だけ変えてやります。

# IMDSv2に対応した形でインスタンスメタデータを取得し、administrators_authorized_keysファイルに書き込む
$administratorsKeyPath = Join-Path $env:ProgramData 'ssh\administrators_authorized_keys'
$params = @{
    Headers = @{
        "X-aws-ec2-metadata-token" = Invoke-RestMethod 'http://169.254.169.254/latest/api/token' -Method Put -Headers @{ "X-aws-ec2-metadata-token-ttl-seconds" = 60 }
    }
    Uri     = 'http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key/'
}
Invoke-RestMethod @params | Out-File -FilePath $administratorsKeyPath -Encoding ascii

その他の手順は従来通りです。

4.(Optional) デフォルトシェルの変更

従来通りの手順です。

追加手順 : Windows Firewall設定

次のコマンドでOpenSSH SSH Server (sshd)ルールを全てのプロファイルで有効にします。

# OpenSSH SSH Server (sshd) ルールのプロファイを更新
Set-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -Enabled 'True' -Profile Any

これでWindows Server 2025環境でも期待通りの動作をさせることができます。

Microsoft公式ドキュメント

一応Microsoft公式ドキュメントも紹介しておきます。

https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse?tabs=powershell&pivots=windows-server-2025

最後に

以上となります。

まだWindows Serverでsshdを使う人は少ないでしょうが誰かの役に立てば幸いです。

脚注
  1. 初期状態では停止しており、実際に利用するにはサービスの起動が必要 ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.